<?php
class Model_Place extends ZloY_Model_CRUD implements Model_Rating_Interface, Model_Comments_Interface {
	/*
	 * Класс рейтинга
	 */
	protected $_rating;
	
	/*
	 * Класс комменариев
	 */
	protected $_comments;
	
	/*
	 * Установка класса id, рейтинга и комменраиев 
	 */
	public function __construct($id=null){
		parent::__construct($id);
		$this->_rating = new Model_Rating(null, 'place');
		$this->_comments = new Model_Comments(null, 'place');
	}
	
	/*
	 * Получение класса таблицы которую использует модель
	 */
	public function getTable() 
	{
		return new Model_DbTable_Place();
	}
	/*
	 * Получение максимального id
	 */
	public function getMaxId($user_id)
	{
		$select = $this->_table->select()->from($this->_table, array('max' => 'MAX(id)'))->where('user_id = ' . (int) $user_id);
		$result = $this->_table->fetchAll($select);
		return $result[0]['max'];
	}
	
	/*
	 * Возвращает все места
	 */
	public function getAll($paginator = false, $publicate = false){
		if($paginator){
			
			$select = $this->_table->select();
			if($publicate){
				$select->where('publicate = 1');
			}
			return $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbTableSelect($select));
		} else {
			if($publicate){
				return $this->_table->fetchAll('publicate = 1');
			} else {
				return $this->_table->fetchAll();
			}
			
		}
	}
	/*
	 * Получение всех категорий к которым привязанно место
	 */
	public function getCategorys()
	{
		$select = $this->_table->getAdapter()
			->select()
			->from(array('c'=>'category'), array('id'=>'c.id','name'=>'c.name', 'parent'=>'c.parent', 'level'=>'c.level'))
			->join(array('cc'=>'connect_category_place'), 'c.id  = cc.category_id', array())
			->where('cc.item_id = ' . $this->_row->id)->group('c.id');
		return $this->_table->getAdapter()->fetchAll($select);
	}
	
	/*
	 * Установка того что пользователь был в этом месте 
	 */
	public function setWas()
	{
		if(isset($this->_row)){	
			$this->_rating->set($this->_row->id, 1);
			$this->_row->was++;
			$this->save();
		}
	}
	
	/*
	 * Установка рейтинга
	 */
	public function setRating($mark)
	{
		if(isset($this->_row)){		
			$this->_rating->set($this->_row->id, $mark);
			$this->_row->rating+=$mark;
			$this->save();
		}
	}
	
	/*
	 * Получение рейтинга
	 */
	public function getRating()
	{
		if(isset($this->_row)){
			$select = $this->_rating->getTable()->select()->from($this->_rating->getTable(), array('sum'=>'SUM(mark)'))
				->where('item_id = ' . $this->_row->id);
			$result = $this->_rating->getTable()->fetchAll($select);
			return $result[0]['sum'];		
		}
	}
	
	/*
	 * Голосовал ли пользователь за данное место
	 */
	public function isVoted($user_id)
	{
		return $this->_rating->isVoted($this->_row->id, $user_id);
	}
	
	/*
	 * установка класса рейтинга
	 */
	public function setRatingClass(Model_Rating $rating){
		$this->_rating  = $rating;
	}
	
	/*
	 * добавление количества комментариев 
	 */
	public function addCommentCount($count){
		if(isset($this->_row)){
			$this->_row->comment_count += $count;
			$this->save();
		}
	}
	
	public function setParent($id)
	{
		$this->_row->parent = (int)$id;
		$this->save();
	}
	
	public function getChildren()
	{
			$select = $this->_table->select()->from('place')->where('parent ='. (int) $this->_row->id);
			return $this->_table->fetchAll($select);
	}
	
	public function autocomplete($query)
	{
		if(trim($query) != ''){
			$file = file($_SERVER['DOCUMENT_ROOT'].'/files/places.txt');
			$places = array();
			foreach ($file as $place) 
			{
				$separatedPlace = explode('.', $place);
				for($i=0; $i<mb_strlen($separatedPlace[0],'UTF-8'); $i++)
				{
					$part = mb_substr($separatedPlace[0],$i, mb_strlen($query, 'UTF-8'),"UTF-8");
					if(mb_strtolower($part, 'UTF-8') == mb_strtolower($query,'UTF-8') && !key_exists($separatedPlace[1],$places)){
						$places[$separatedPlace[1]] = array($separatedPlace);
					}
				}
			}
			return $places;
		} else { 
			return array();
		}
	}
	protected function saveToFile()
	{
		$file = fopen($_SERVER['DOCUMENT_ROOT']. '/files/places.txt', 'a+');
		if(trim($this->_row->name) != ''){
			fwrite($file, $this->_row->name . '.' .$this->_row->id . "\n");
		}
		fclose($file);
	}
	
	protected function deleteFromFile($id)
	{
		$fileArray = file($_SERVER['DOCUMENT_ROOT']. '/files/places.txt');
		copy($_SERVER['DOCUMENT_ROOT']. '/files/empty.txt',$_SERVER['DOCUMENT_ROOT']. '/files/places.txt');
		$file = fopen($_SERVER['DOCUMENT_ROOT']. '/files/places.txt', 'a+');
		foreach($fileArray as $place)
		{
			$separatedPlace = explode('.', $place);
			if($id != intval($separatedPlace[1])){
				fwrite($file,$place);
			}
		}
		fclose($file);
	}
	
	public function save()
	{
		$this->deleteFromFile($this->_row->id);
		$this->saveToFile();
		return parent::save();
		
	}
}